﻿using System;

namespace Lesson_1枚举
{
    #region 基本概念
    //枚举：被命名的整形常量的集合，一般用于表示 状态 类型等等
    //1.申明枚举：创建一个自定义枚举类型
    //2.申明枚举变量：使用申明的自定义枚举类型，创建一个枚举变量
    //语法：
    //枚举名往往以E_开头作为命名规范

    //enum E_自定义枚举名
    //{
    //  自定义枚举项名     //枚举中包裹的整形常量，第一次默认值为0，向下铱次累加1，也可单独进行赋值
    //                      若下一项未单独赋值，则该项默认值为上一项加1
    //  ......
    //  自定义枚举项名
    //}

    enum E_EnemyType
    {
        Normal = 1,     //单独赋值
        Boss,           //默认为上一项 + 1，即等于2
    }
    #endregion

    #region 在哪里申明枚举
    enum E_PlayerType
    {
        Main,
        Other,
    }
    //1.namespace语句块中（常用）
    //2.class语句块中 / struct语句块中（不常用）
    //3.不能在函数语句块中申明
    #endregion

    class Program
    {
        static void Main(string[] args)
        {
            
            #region 申明枚举变量
            //定义语法
            //访问枚举变量成员：自定义枚举类型.枚举成员
            //自定义枚举类型 变量名 = 自定义枚举类型.枚举成员
            E_EnemyType enemyType = E_EnemyType.Boss;
            E_PlayerType playerType = E_PlayerType.Main;

            //往往配合条件分支语句使用
            if(enemyType == E_EnemyType.Boss)
            {
                Console.WriteLine("Boss逻辑");
            }
            else
            {
                Console.WriteLine("普通敌人逻辑");
            }

            //最常搭配switch使用
            switch (playerType)     //输入playerType后按下回车可自动补全下方语句(输入switch后按Tab)
            {
                case E_PlayerType.Main:
                    Console.WriteLine("主玩家逻辑");
                    break;
                case E_PlayerType.Other:
                    Console.WriteLine("其他玩家逻辑");
                    break;
                default:
                    break;
            }
            #endregion

            #region 枚举的类型转换
            //1.枚举与int互转 （括号强转）
            //枚举转int
            int i = (int)playerType;    //括号强转
            Console.WriteLine(i);

            //int转枚举（较常用）
            playerType = (E_PlayerType)i;
            Console.WriteLine(playerType);  //输出枚举成员名：值为0输出Main，值为1输出Other
            playerType = (E_PlayerType)1;
            Console.WriteLine(playerType);

            //2.枚举与string互转
            //枚举转string
            string str = enemyType.ToString();
            Console.WriteLine(str);         //str的值为枚举成员名

            //string转枚举
            enemyType = (E_EnemyType)Enum.Parse(typeof(E_EnemyType), "Normal");
            //Parse括号中 第一个参数：要转的是哪种类型的枚举类型 第二个参数：要转的字符串
            //转完后是一个通用类型，用括号强转成目标枚举类型
            #endregion

            #region 枚举的作用
            //游戏开发中 对象很多时候会有许多状态
            //比如玩家 有一个动作状态 我们需要用一个变量或标识 来表示玩家当前处于哪种状态
            //综合考虑 往往使用 int 来表示他的状态
            //比如 1行走 2待机 3跑步 4跳跃
            //枚举可以帮助我们 清晰的分清楚状态的含义
            #endregion

        }
    }
}